/**
 * @author https://vue-admin-beautiful.com （不想保留author可删除）
 * @description 路由守卫，目前两种模式：all模式与intelligence模式
 */
import router from '@/router'
import store from '@/store'
import VabProgress from 'nprogress'
import 'nprogress/nprogress.css'
import getPageTitle from '@/utils/pageTitle'
//                                           顶部进度条
import { authentication, loginInterception, progressBar, recordRoute, routesWhiteList } from '@/config'

VabProgress.configure({
  easing: 'ease',
  speed: 500,
  trickleSpeed: 200,
  showSpinner: false,
})
router.beforeResolve(async (to, from, next) => {
  //判断是否需要显示进度条
  if (progressBar) VabProgress.start()

  let hasToken = store.getters['user/accessToken']
  //判断用户如果不需要登录拦截，则将hasToken设置为true
  if (!loginInterception) hasToken = true

  if (hasToken) {
    //如果用户已经登录，则判断目标路由是否为登录页，如果是则跳转到首页，并结束进度条。
    if (to.path === '/login') {
      next({ path: '/' })
      if (progressBar) VabProgress.done()
    } else {
      const hasPermissions = store.getters['user/permissions'] && store.getters['user/permissions'].length > 0
      //如果目标路由不是登录页，则判断用户是否已经获取了权限信息
      if (hasPermissions) {
        //如果已经获取了权限信息，则直接跳转到目标路由
        next()
      } else {
        //如果没有获取权限信息，则尝试获取用户信息。
        try {
          let permissions
          if (!loginInterception) {
            //settings.js loginInterception(登录拦截)为false时，创建虚拟权限 （setPermissions：设置用户权限列表）
            await store.dispatch('user/setPermissions', ['admin'])
            permissions = ['admin']
          } else {
            //permissions: ['admin']
            permissions = await store.dispatch('user/getUserInfo')
          }
          let accessRoutes = []

          //intelligence和all两种方式，前者后端权限只控制permissions不控制view文件的import（前后端配合，减轻后端工作量），all方式完全交给后端前端只负责加载
          if (authentication === 'intelligence') {
            accessRoutes = await store.dispatch('routes/setRoutes', permissions)
          } else if (authentication === 'all') {
            //设置所有的路由
            /* accessRoutes = await store.dispatch('routes/setAllRoutes') */
            accessRoutes = await store.dispatch('routes/setRoutes', permissions)
          }
          accessRoutes.forEach((item) => {
            //将获取到的路由信息添加到路由中，并跳转到目标路由。
            router.addRoute(item)
          })
          next({ ...to, replace: true })
        } catch {
          //如果获取用户信息或路由信息出错，则重置用户的访问令牌，并结束进度条。
          await store.dispatch('user/resetAccessToken')
          if (progressBar) VabProgress.done()
        }
      }
    }
  } else {
    if (routesWhiteList.indexOf(to.path) !== -1) {
      //如果用户未登录且目标路由在白名单中，则直接跳转到目标路由。
      next()
    } else {
      if (recordRoute) {
        //如果用户未登录且目标路由不在白名单中，则根据是否记录路由进行跳转。
        next(`/login?redirect=${to.path}`)
      } else {
        next('/login')
      }
      //结束进度条，并设置页面标题。
      if (progressBar) VabProgress.done()
    }
  }
  document.title = getPageTitle(to.meta.title)
})
router.afterEach(() => {
  if (progressBar) VabProgress.done()
})
